home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Suzy B Software 2
/
Suzy B Software CD-ROM 2 (1994).iso
/
prntutil
/
gemgs13
/
util.c
< prev
Wrap
C/C++ Source or Header
|
1995-04-25
|
6KB
|
266 lines
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <aesbind.h>
#include <vdibind.h>
#include "ps.h"
#define MAXLEN 80
#define MIN(x, y) ((x <= y) ? x : y)
extern struct document *docinfo;
/* Pathfind(path, file, sep) searches for 'file' in the path given
* by the envionment variable named in 'env'. Sep specifies the
* path separator. It returns a pointer to the filename if it is
* found, and a NULL if not.
*/
char *pathfind(char *env, char *file, char *sep)
{
FILE *fp;
char path[2*MAXLEN];
static char name[MAXLEN];
char *ptr;
char *presub();
if ((fp = fopen(file, "r")) == NULL) {
if ((ptr = getenv(env)) != NULL) {
strcpy(path, ptr);
}
else {
return NULL;
}
if ((ptr = presub(path, sep)) == NULL) {
return NULL;
}
do {
strcpy(name, ptr);
if (name[strlen(name)-1] != '\\' ||
name[strlen(name)-1] != '/') strcat(name, "\\");
strcat(name, file);
if ((fp = fopen(name, "r")) != NULL) {
fclose(fp);
return name;
}
} while ((ptr = presub(NULL, sep)) != NULL);
}
else {
fclose(fp);
return file;
}
}
/* Presub(s, subs) searches the string s for the substring subs. Presub
* returns a pointer to the NULL terminated substring which immediately
* preceeds subs. If presub is called again with a NULL pointer for s,
* it returns a pointer to the substring between the previous subs and
* the current subs. If subs is a null character, presub returns a pointer
* to the portion of s between the previous subs and the end of s.
*/
char *presub(s, subs)
char *s, *subs;
{
int sublen;
char *mptr;
static int count;
static char match[MAXLEN], *ptr;
if (s != NULL) {
ptr = s;
count = 0;
}
mptr = match + count;
if ((sublen = strlen(subs)) == 0) {
strcpy(mptr, ptr);
return (mptr);
}
while (*ptr != '\0') {
if (strncmp(ptr, subs, sublen) == 0) {
match[count] = '\0';
ptr += sublen;
++count;
return (mptr);
}
match[count] = *ptr;
++ptr;
++count;
}
if ((match + count) > mptr) {
match[count] = *ptr;
++count;
return (mptr);
}
return (NULL);
}
int page_filter(char* input, char *pagestr, char *output)
{
void pscopy();
char *strptr1, *strptr2;
char *presub();
int num_list=0, num_pages, page_order, count;
int pagelist[40][2];
FILE *infp, *outfp;
struct page *pageptr1, *pageptr2;
if ((strptr1 = pathfind("GS_LIB", input, ",")) == NULL) {
return -1;
}
if ((infp = fopen(strptr1, "r")) == NULL) {
return -1;
}
if ((outfp = fopen(output, "wb")) == NULL) {
return -1;
}
if ((strptr1 = presub(pagestr, ",")) == NULL) {
return -1;
}
do {
if ((strptr2 = strchr(strptr1, '-')) == NULL) {
pagelist[num_list][1] = atoi(strptr1);
pagelist[num_list++][2] = atoi(strptr1);
}
else {
*strptr2 = '\0';
pagelist[num_list][1] = atoi(strptr1);
pagelist[num_list++][2] = atoi(strptr2+1);
}
} while ((strptr1 = presub(NULL, ",")) != NULL);
num_pages = docinfo->numpages;
page_order = docinfo->pageorder;
/* Copy to the beginning of the first page into PAGEFILE. */
pageptr1 = &docinfo->pages[0];
pscopy(infp, outfp, 0, pageptr1->begin - 1);
/* Copy the requested pages into PAGEFILE. */
for (count=0; count < num_list; count++) {
pagelist[count][2] = MIN(pagelist[count][2], num_pages);
if (pagelist[count][1] <= pagelist[count][2]) {
if (page_order == ASCEND) {
pageptr1 = &docinfo->pages[pagelist[count][1] - 1];
pageptr2 = &docinfo->pages[pagelist[count][2] - 1];
}
else if (page_order == DESCEND) {
pageptr2 = &docinfo->pages[num_pages - pagelist[count][1]];
pageptr1 = &docinfo->pages[num_pages - pagelist[count][2]];
}
else {
return -1;
}
pscopy(infp, outfp, pageptr1->begin, pageptr2->end);
}
}
/* Copy from the end of the last page to EOF into PAGEFILE. */
pageptr1 = &docinfo->pages[num_pages - 1];
pscopy(infp, outfp, pageptr1->end + 1, docinfo->endtrailer);
fclose(infp);
fclose(outfp);
}
/* Routine itoa(s, num) converts an integer, num, to an ascii string
* representation of the integer, pointed to by s. The integer 100 is
* converted to the string "100", etc.
*/
char *itoa(s, number)
int number;
char *s;
{
/* Local variables:
* i: loop counter,
* j: number of loops needed to transpose the string in s,
* body: integer part of num/10,
* remain: remainder of num/10,
* sign: sign of the integer,
* count: number of times num is divisible by 10,
* temp: temporary character storage.
*/
int i, j, num, body, remain, sign, count;
char temp;
count = 0;
num = number;
sign = 1;
if (num == 0) {
s[count] = '0';
++count;
} else {
if (num < 0) {
sign = -1;
num = -num;
}
while (num > 0) { /* Divide by 10, convert */
body = (num/10); /* remainder to ascii */
remain = num - body*10;
s[count] = remain + '0';
num = body;
++count;
}
if (sign < 0) {
s[count] = '-';
++count;
}
/* Ascii representation is transposed in s, so put it in
* the right order. */
j = count/2;
for (i = 0; i < j; ++i) {
temp = s[i];
s[i] = s[count-(i+1)];
s[count-(i+1)] = temp;
}
}
s[count] = '\0';
return(s);
}